/*************************************************************************************************************************
Multi-Include-Prevent Segment
**************************************************************************************************************************/
#ifndef SWITCH_H__
#define SWITCH_H__

/*************************************************************************************************************************
Include File Segment
**************************************************************************************************************************/

#include "IF_Switch.h"
/*************************************************************************************************************************
Type Segment
**************************************************************************************************************************/

/*************************************************************************************************************************
Define Segment
**************************************************************************************************************************/
#define SWITCH_STRUCT_SIZE          6
#define HALL_NUM          		5
/*PHOTO_INTER_1***********************************************************/
#define PHOTO_INTER_1_ON_LV                 HIGH
#define PHOTO_INTER_1_FLT_TIMES             5

/*PHOTO_INTER_2***********************************************************/
#define PHOTO_INTER_2_ON_LV                 HIGH
#define PHOTO_INTER_2_FLT_TIMES             5

/*PHOTO_INTER_3***********************************************************/
#define PHOTO_INTER_3_ON_LV                 HIGH
#define PHOTO_INTER_3_FLT_TIMES             5

/*PHOTO_INTER_4***********************************************************/
#define PHOTO_INTER_4_ON_LV                 HIGH
#define PHOTO_INTER_4_FLT_TIMES             5

/*PARK_SW***********************************************************/
#define PARK_SW_ON_LV                  HIGH
#define PARK_SW_FLT_TIMES              5

/*IG_IO_PB***********************************************************/
#define IG_ON_LV             HIGH
#define IG_FLT_TIMES         5


#define GEAR_ERROR_TIME                300
#define GEAR_DETECTED_ERROR            0xA0



#define T_DIAG_START                   150 /*1500ms Task_10ms  */
#define DIAG_MECH_ERR_TIME             45000 /*45s  Task_10ms  */

//GPIO滤波时间
#define GPIO_SCAN_PERIOD            10                 /* ms */
#define GPIO_LEVEL_THRES            50                /* ms */
#define GPIO_LONG_PRESS_THRES       1000//300          /* ms */
#define GPIO_TIMEOUT				30000//30s
#define SWITCH_SCAN_PERIOD          10                 /* ms */
/* 挡位时间参数设置 */
#define GEAR_FILTER_TIME            50  /* 50ms 挡位滤波时间 */
#define HAL_ERR_FILTER_TIME         100 /* 100ms 霍尔异常时挡位滤波时间 */
#define PADDLE_ACT_FLT_TIME			40  /* 40ms 拨杆动作时间 */
#define PHOTO_STEADY_TIME           100 /* 光电稳定时间 */
//moving time
#define TX_REQ_DELAY				200 /* 200ms 发送延迟，使用中实际未生效 */
//#define SCU_RCV_VCU_DELAY			50	/* 50ms 公差:50~80ms */
#define SCU_VCU_SYN_DELAY			200	/* 200ms 公差:±30ms */
#define VCU_GEAR_FILTER_TIME        5   /* 50ms  接收VCU挡位信号滤波时间 公差:50~80ms */

#define PWRON_HALL_ERR_CONFIRM_TIME  100   //1s=200*10ms 上电，检测到霍尔错误时，延时时间//


#define P_BUTTON_LONG_PRESS_TIME	500		/* P挡按键长按时间 */
#define P_BUTTON_SHORT_TIME			4500	/* P挡按键长按时间 */

/* 真值表手柄位置定义 */
#define HAND_SHANK_UP_2_GEAR    0b0001	//上拨2档
#define HAND_SHANK_UP_1_GEAR    0b1001	//上拨1档
#define HAND_SHANK_ORIGIN       0b1100	//中心位置
#define HAND_SHANK_DOWN_1_GEAR  0b0110	//下拨1档
#define HAND_SHANK_DOWN_2_GEAR  0b0011	//下拨2档

#define SCU_CAN_TX_GEAR_INIT    0x8
#define SCU_CAN_TX_GEAR_D       0x9
#define SCU_CAN_TX_GEAR_N       0xA
#define SCU_CAN_TX_GEAR_R       0xB
#define SCU_CAN_TX_GEAR_P       0xC

#define VCU_CAN_RX_GEAR_D       0xE
#define VCU_CAN_RX_GEAR_N       0x0
#define VCU_CAN_RX_GEAR_R       0xD
#define VCU_CAN_RX_GEAR_P       0xF
/*************************************************************************************************************************
Enum Segment
**************************************************************************************************************************/
typedef enum
{
    Release,
    PressFlt,
    Press,
    ReleaseFlt,
} SwitchEnum;

typedef enum
{
	BIT_PASS,
	BIT_ERROR
} PHO_ERR_FLG;

typedef enum	//与PhotoIntValue对应//
{
	POINT_0_RST, //0点位置
	POINT_1_POS, //1点位置
	POINT_2_POS, //2点位置
	POINT_1_NEG, //-1点位置
	POINT_2_NEG, //-2点位置
	POINT_INIT,	 //初始值
	POINT_ERR    //错误位置
}PhoPointIdx;

//增量值//
#define MovNone		0
#define	MovTo_0		1
#define	MovTo_Z_1	2
#define	MovTo_Z_2	3
#define	MovTo_F_1	4
#define	MovTo_F_2	5
#define	MovTo_ERR	6
//	INC_ERR    //增量错误//
//GearIncrease;//
/*************************************************************************************************************************
Union Segment
**************************************************************************************************************************/
/*****************光电开关组合逻辑值联合体***************/
typedef union
{
	uint8_t Value;
	struct
	{
		uint8_t photo4 : 1;
		uint8_t photo3 : 1;
		uint8_t photo2 : 1;
		uint8_t photo1 : 1;
		uint8_t res : 4;
	}bits;
} HallSensorValue;

typedef union
{
	uint8_t Value;
	struct
	{
		uint8_t photo4 : 1;
		uint8_t photo3 : 1;
		uint8_t photo2 : 1;
		uint8_t photo1 : 1;
		uint8_t park_sw : 1;
		uint8_t kl15 : 1;
		uint8_t :2;
	}bits;
} InputT;

/*************************************************************************************************************************
Structure Segment
**************************************************************************************************************************/
/*****************光电开关结构体***************/
typedef struct PhotoIntType
{
	PhoPointIdx MachPosIdx;		 		//机械手柄位置
	HallSensorValue  CommbValue; 		//光电开关组合逻辑值
	uint8_t  ErrSensorIndex;	 		//错误光电位索引号
	uint8_t  ScuGearEn;
	int8_t   IncCnt;			 		//光电开关增量，取值范围[-2, -1, 0, 1, 2] 
	uint16_t ErrPositionCode;	 		//每个位置占2位  0:未测试 1:匹配失败 2:匹配成功			  暂无无用
	// uint8_t  ErrSensorVaule[HALL_NUM];	//不按位置索引号存放错误值
	uint8_t  ErrSensorConfirmIdx;
	uint8_t  PassPositionFlag; 		 	//匹配的位置   bit0:POINT_0_RST,  bit1:POINT_1_POS,  bit2:POINT_2_POS,  bit3:POINT_1_NEG,  bit4:POINT_2_NEG
	uint8_t  ErrorVaule[5];   	 		//不按位置索引号存放错误值
	uint8_t  ErrorPositionCount; 		//霍尔匹配错误的位置计数器
	uint8_t  ConfirmPosition[HALL_NUM]; //0:未匹配或匹配失败  1:已正确匹配
	uint8_t  PreHallValue;
} PhotoInt_ST;

/*****************档位结构体***************/
typedef struct GearTypeTag
{
    uint8  GearCurState;
	uint16 TxReqGearDelay; //与VCU同步时间//
} Machine_ST;
extern Machine_ST MachSt;
/******************************************/

typedef struct SwitchDiagTypeTag
{
	uint8  DiagEnable;
	uint8  MechFault;
	uint16 MechFaultCnt;
} SwitchDiag_ST;


typedef struct
{
    uint8 Port;
    const uint16 Pin;
    const uint8 OnLv;
    const uint8 FltTime;
    uint8 FltCnt;
    SwitchEnum Flt;
    
} SwitchStruct;


/*************************************************************************************************************************
Function Declare Segment
**************************************************************************************************************************/


#endif